package co.inventario.datos.sqlserver;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import co.inventario.entidad.CiudadDTO;
import co.inventario.entidad.ZonaDTO;

public class ZonaDAOSQLServer {

	private String crearSQL;
	private String actualizarSQL;
	private String consultarSQL;

	public ZonaDAOSQLServer() {
		crearSQL = "";
		actualizarSQL = "";
		consultarSQL = "";
	}

	public void crear(ZonaDTO zonaDTO, Connection connection) throws SQLException {
		crearSQL = "INSERT INTO Zona (Nv_Nombre_Zona, In_Codigo_Ciudad) VALUES (?, ?)";
		try (PreparedStatement preparedStatement = connection.prepareStatement(crearSQL)) {
			preparedStatement.setString(1, zonaDTO.getNvNombreZona());
			preparedStatement.setInt(2, zonaDTO.getCiudadDTO().getInCodigoCiudad());
			preparedStatement.executeUpdate();
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema creando la Zona: " + exception.getMessage());
		}
	}

	public void actualizar(ZonaDTO zonaDTO, Connection connection) throws SQLException {
		actualizarSQL = "UPDATE Zona SET Nv_Nombre_Zona = ISNULL(?, Nv_Nombre_Zona), In_Codigo_Ciudad = ISNULL(?, In_Codigo_Ciudad) WHERE In_Codigo_Zona = ?";
		try (PreparedStatement preparedStatement = connection.prepareStatement(actualizarSQL)) {
			preparedStatement.setString(1, zonaDTO.getNvNombreZona());
			preparedStatement.setInt(2, zonaDTO.getCiudadDTO().getInCodigoCiudad());
			preparedStatement.setInt(3, zonaDTO.getInCodigoZona());
			preparedStatement.executeUpdate();
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema actualizando la Zona: " + exception.getMessage());
		}
	}

	public ZonaDTO consultarPorCodigo(ZonaDTO zonaDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Zona WHERE In_Codigo_Zona = ?";
		ZonaDTO zonaDTOResultado = null;
		CiudadDTO ciudadDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setInt(1, zonaDTO.getInCodigoZona());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				while (resultSet.next() == true) {
					zonaDTOResultado = new ZonaDTO();
					zonaDTOResultado.setInCodigoZona(resultSet.getInt("In_Codigo_Zona"));
					zonaDTOResultado.setNvNombreZona(resultSet.getString("Nv_Nombre_Zona"));
					ciudadDTO = new CiudadDTO();
					ciudadDTO.setInCodigoCiudad(resultSet.getInt("In_Codigo_Ciudad"));
					zonaDTOResultado.setCiudadDTO(ciudadDTO);
				}
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando la Zona a traves del codigo: " + exception.getMessage());
		}
		return zonaDTOResultado;
	}

	public ZonaDTO consultarPorNombre(ZonaDTO zonaDTO, Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Zona WHERE Nv_Nombre_Zona = ?";
		ZonaDTO zonaDTOResultado = null;
		CiudadDTO ciudadDTO = null;
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			preparedStatement.setString(1, zonaDTO.getNvNombreZona());
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				while (resultSet.next() == true) {
					zonaDTOResultado = new ZonaDTO();
					zonaDTOResultado.setInCodigoZona(resultSet.getInt("In_Codigo_Zona"));
					zonaDTOResultado.setNvNombreZona(resultSet.getString("Nv_Nombre_Zona"));
					ciudadDTO = new CiudadDTO();
					ciudadDTO.setInCodigoCiudad(resultSet.getInt("In_Codigo_Ciudad"));
					zonaDTOResultado.setCiudadDTO(ciudadDTO);
				}
			}
		} catch (SQLException exception) {
			System.err.println("Se ha presentado un problema consultando la Zona a traves del nombre: " + exception.getMessage());
		}
		return zonaDTOResultado;
	}

	public ArrayList<ZonaDTO> consultarTodo(Connection connection) throws SQLException {
		consultarSQL = "SELECT * FROM Zona";
		ZonaDTO zonaDTOResultado = null;
		CiudadDTO ciudadDTO = null;
		ArrayList<ZonaDTO> zonaDTOLista = new ArrayList<ZonaDTO>();		
		try (PreparedStatement preparedStatement = connection.prepareStatement(consultarSQL)) {
			try (ResultSet resultSet = preparedStatement.executeQuery()) {
				while (resultSet.next() == true) {
					zonaDTOResultado = new ZonaDTO();
					zonaDTOResultado.setInCodigoZona(resultSet.getInt("In_Codigo_Zona"));
					zonaDTOResultado.setNvNombreZona(resultSet.getString("Nv_Nombre_Zona"));
					ciudadDTO = new CiudadDTO();
					ciudadDTO.setInCodigoCiudad(resultSet.getInt("In_Codigo_Ciudad"));
					zonaDTOResultado.setCiudadDTO(ciudadDTO);
					zonaDTOLista.add(zonaDTOResultado);
				}
			}
		}
		return zonaDTOLista;
	}
}
